WRAP_FUNC = malloc
WRAP_FUNC += calloc
WRAP_FUNC += realloc
WRAP_FUNC += free
#WRAP_FUNC += _Znwj #operator new(unsigned int)
#WRAP_FUNC += _Znaj #operator new[](unsigned int)

WRAP_FUNC += _Znwm #operator new(unsigned int)
WRAP_FUNC += _Znam #operator new[](unsigned int)
#new(u32) 被编码成了 _Znwm, new[](u32)被编码成了 _Znam

WRAP_FUNC += _ZdaPv #operator delete[](void*)
WRAP_FUNC += _ZdlPv #operator delete(void*)

WRAP_FUNCS = $(foreach n,$(WRAP_FUNC),-Wl,--wrap=$(n))

all:
	g++ -c -g main.cpp -o main.o
	g++ -c -g mem_leak_chk.cpp -o mem_leak_chk.o
	g++ -c -g mem_chk_db.cpp -o mem_chk_db.o
	g++ $(WRAP_FUNCS) -rdynamic -g main.o mem_leak_chk.o mem_chk_db.o -o main


clean:
	rm -rf *.o main test/e



#m@mV:~/study/mem_leak_check_tool$ uname -a
#Linux mV 6.8.0-48-generic #48~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Oct  7 11:24:13 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
# /usr/bin/ld: mem_leak_chk.o: in function `__wrap__Znaj':
# /home/m/study/mem_leak_check_tool/mem_leak_chk.cpp:84: undefined reference to `operator new[](unsigned int)'
# /usr/bin/ld: mem_leak_chk.o: in function `__wrap__Znwj':
# /home/m/study/mem_leak_check_tool/mem_leak_chk.cpp:103: undefined reference to `operator new(unsigned int)'
# 也就是new(u32) 和 new[](u32)链接错误。 这个原因是g++的版本不同 libstd.so提供的 这个函数的声明(mangled)变了
#为了验证现在的环境中的new 和 new[]变成了什么样的了，先编写一段简单的代码
# int main() {
#     int* a = new int;
#     int* b = new int[4];
#     return 0;
# }
# 编译：   g++ -g a.cpp -o ./e
# 反汇编： objdump -DS ./e  > e.dump.txt    我要在main函数的实现中找到这样的代码
    # int* a = new int;
    # 117a:	e8 f1 fe ff ff       	call   1070 <_Znwm@plt>
    # int* b = new int[4];
    # 1188:	e8 d3 fe ff ff       	call   1060 <_Znam@plt>
#也就是说  new(u32) 被编码成了 _Znwm, new[](u32)被编码成了 _Znam
#这就好办了 将这两个函数wrap和real名字改了就好
